21-1 峞Gc簡

在 ASP 中,我們可以使用微軟作業系統內建的 WinHttp.WinHttpRequest.5.1 元件來抓取其他網頁資訊,進行處理後,再展示處理後的結果。例如,下列範例使用 WinHttp.WinHttpRequest.5.1 元件來抓取 Google 的首頁(http://www.google.com.tw),然後顯示此網頁的原始碼,如下:

Example(getWebPage/showSource01.asp):

上述範例的原始碼如下:

原始檔(getWebPage/showSource01.asp):(灰色區域按兩下即可拷貝)
<%@language=JScript%>
<% title="抓取 utf-8 網頁並顯示原始碼" %>
<!--#include file="../head.inc"-->
<hr>
<%
url="http://www.google.com.tw";		// The URL to download
httpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
httpReq.Open("GET", url, false);
httpReq.Send();			// Download the file
content = httpReq.ResponseText;
%>

<fieldset>
<legend><a target=_blank href="<%=url%>"><%=url%></a> 的原始碼</legend>
<xmp><%=content%></xmp>
</fieldset>

<hr>
<!--#include file="../foot.inc"-->

在上述範例中,由於 Google 的首頁是以 utf-8 編碼,WinHttp.WinHttpRequest.5.1 剛好能夠支援,所以一切沒有問題。但是如果你要抓的網頁是以 big5 編碼,那回傳的內容必須經由編碼過程,才能呈現正確結果,否則就會出現亂碼。在下面這個範例中,我們抓取一個大五碼的網頁,並使用另外一個元件 adodb.stream 來進行編碼:

Example(getWebPage/showSource03.asp):

上述範例的原始碼如下:

原始檔(getWebPage/showSource03.asp):(灰色區域按兩下即可拷貝)
<%@language=JScript%>
<% title="抓取 big5 網頁並顯示原始碼" %>
<!--#include file="../head.inc"-->
<hr>
<%
url = "http://neural.cs.nthu.edu.tw/jang/books/html/example/image02.htm";
// Step 1: 使用 WinHttp.WinHttpRequest 元件來抓取網頁
WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
WinHttpReq.Open("GET", url, false);
WinHttpReq.Send();			// Download the file
content = WinHttpReq.ResponseBody;	// 抓回 binary 的資料
// Step 2: 使用 adodb.stream 元件來進行文件編碼
oStream = new ActiveXObject("adodb.stream");   
oStream.Type=1;			// 以二進位方式操作
oStream.Mode=3;			// 可同時進行讀寫
oStream.Open();			// 開啟物件
oStream.Write(content);		// 將 content 寫入物件內
oStream.Position=0;		// 從頭開始
oStream.Type=2;			// 以文字模式操作
oStream.Charset="Big5";		// 設定編碼方式
result= oStream.ReadText();	// 將物件內的文字讀出
%>

<fieldset>
<legend><a target=_blank href="<%=url%>"><%=url%></a> 的原始碼</legend>
<xmp><%=result%></xmp>
</fieldset>

<hr>
<!--#include file="../foot.inc"-->

在上述範例中,我們使用了 adodb.stream 元件,此元件提供了處理 binary 及 ascii 資料的各種方法,功能很強大。範例原始碼有相關註解,在此不再贅述。若要知道此元件的其他用法,讀者可以在 Google 輸入 adodb.stream,就可以找到相關的網頁說明。

我們也可以抓出網頁後,立刻使用另一個元件 Hokoy.WordKit 來將此網頁內容轉成簡體文字,再呈現於網頁,範例如下:

Example(getWebPage/big5toGb01.asp):

(若上述範例無法正確呈現,則表示對應伺服器尚未安裝 Hokoy.WordKit 元件。)此範例的原始碼如下:

原始檔(getWebPage/big5toGb01.asp):(灰色區域按兩下即可拷貝)
<%@language=jscript%>
<%title="抓取繁體網頁並以簡體呈現"%>
<%
url = "http://neural.cs.nthu.edu.tw/jang/books/html/example/image02.htm";
// Step 1: 使用 WinHttp.WinHttpRequest 來抓取網頁
WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
WinHttpReq.Open("GET", url, false);
WinHttpReq.Send();			// Download the file
content = WinHttpReq.ResponseBody;
// Step 2: 使用 adob.stream 來進行網頁資料編碼
oStream = new ActiveXObject("adodb.stream");   
oStream.Type=1;
oStream.Mode=3;
oStream.Open();
oStream.Write(content);
oStream.Position=0;   
oStream.Type=2;
oStream.Charset="Big5"   
result= oStream.ReadText();
// Step 3: 使用 Hokoy.WordKit 來轉換成簡體
wordToolObj = new ActiveXObject("Hokoy.WordKit");
gbContent=wordToolObj.Big5toGB(result);
// Step 4: 改變網頁編碼並將資料呈現於網頁
Response.Charset="gb2312";
Response.Write(gbContent);
%>

在上述範例的原始碼中中,可以看出我們做法如下:

  1. 使用 WinHttp.WinHttpRequest.5.1 元件來抓取一個網頁的內容。
  2. 使用 adodb.stream 元件來將所抓到的 binary 資料轉為 big5 編碼。
  3. 使用 Hokoy.WordKit 元件來將繁體轉成簡體。
  4. 使用 Response.Charset 來將網頁編碼改為 "gb2312" 的簡體編碼,並將資料寫入網頁。

但由於我們先將網頁內容轉成簡體後,會在不同的路徑呈現網頁,因此所有相對路徑的連結都會發生錯誤。為解決此問題,我們的程式碼必須能夠判斷相對路徑連結的存在,並將之改成絕對路徑,再呈現於新網頁,我們將這一部份的實作當作本章的習題。

此外,上述範例中的 Hokoy.WordKit 是一個很好用的元件,除了可以將中文繁體轉成簡體外,還可以進行各種中文轉碼。此元件可由「老胡烘焙機」所提供,可由下列網址下載:

http://reg.softking.com.tw/freeware/index.asp?fid1=3&fid2=260&fid3=22195
下載 Hokoy.WordKit.dll 後,請註冊此元件:
  1. 將 Hokoy.WordKit.dll 放到 c:\windows\system32 目錄下。
  2. 開啟 DOS 視窗,進入 c:\windows\system32 目錄下,在 DOS 視窗輸入「regsvr32 Hokoy.WordKit.dll」,按「確定」後即完成安裝。

Hint
目前此 Hokoy.WordKit 元件僅能用在 32-bit Windows 平台。

此 Hokoy.WordKit 元件功能可以列表如下:

函式名稱輸入編碼類別輸出編碼類別
GBtoBig5GBBig5
BIG5toGBBig5GB
GBtoUnicodeGBUnicode
Big5toUnicodeBig5Unicode
UnicodetoGBUnicodeGB
UnicodetoBig5UnicodeBig5
SCtoTCUnicode簡體字Unicode繁體字
TCtoSCUnicode繁體字Unicode簡體字

另一個從伺服器端來進行「繁體轉簡體」的解決方案,則可以避開相對路徑的修改,其流程如下:

  1. 在需要轉簡體的網頁導入「繁轉簡」的程式碼檔案(如下述的 big5toGb.inc 檔案)。
  2. 只要網址帶有「language=gb」的參數,上述程式碼就會將網頁內容轉為簡體。
我們先來看一個範例,假設原始繁體網頁如下: 原始碼如下:

原始檔(getWebPage/fullUrl01.asp):(灰色區域按兩下即可拷貝)
<%@language=JScript%>
<% title="繁轉簡" %>
<!--#include file="../head.inc"-->
<hr>

這是一棵漂亮的樹!
<img align=top src="sbtree.gif">

<hr>
<!--#include file="../foot.inc"-->

Example(getWebPage/fullUrl01.asp):

若要將其改成簡體網頁,只需導入 big5toGb.inc 並在網址加入 language=gb 的選項,範例如下:

Example(getWebPage/fullUrl02.asp?language=gb):

(若上述範例無法正確呈現,則表示對應伺服器尚未安裝 Hokoy.WordKit 元件。)此範例的原始碼如下:

原始檔(getWebPage/fullUrl02.asp):(灰色區域按兩下即可拷貝)
<%@language=JScript%>
<!--#include file="big5toGb.inc"-->
<% title="繁轉簡" %>
<hr>

<!--#include file="../head.inc"-->
這是一棵漂亮的樹!
<img align=top src="sbtree.gif">

<hr>
<!--#include file="../foot.inc"-->

在上述範例中,我們已經在原網頁加入繁體轉簡體的程式碼 big5toGb.inc,此時只要在原網頁的網址加上「?language=gb」,此時網頁的內容就會被轉成簡體中文。此外,由於並沒有路徑轉換的問題,因此原網頁使用相對路徑來顯示樹的影像,轉換後並並沒有受到影響。

在上述範例中,所導入的「繁轉簡」程式碼檔案為 big5toGB.inc,內容如下:

原始檔(getWebPage/big5toGb.inc):(灰色區域按兩下即可拷貝)
<%
// 取得此網頁的 http 絕對路徑
function getFullUrl(){
	var domainName=Request.ServerVariables("SERVER_NAME");
	var absPath=Request.ServerVariables("url");
	var queryString=Request.ServerVariables("query_string")+"";

	if (queryString=="")
		url="http://" + domainName + absPath;
	else
		url="http://" + domainName + absPath + "?" + queryString;
	return(url);
}

language=Request("language")+"";
//Response.Write("<script>alert('"+language+"')</script>");
if (language=="gb"){
	url=getFullUrl();
	url=url.replace(/language=gb&/g, "");	// 刪除 language=gb&
	url=url.replace(/language=gb/g, "");	// 刪除 language=gb
	// Step 1: 使用 WinHttp.WinHttpRequest 元件來抓取網頁
	WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
	WinHttpReq.Open("GET", url, false);
	WinHttpReq.Send();			// Download the file
	content = WinHttpReq.ResponseBody;
	// Step 2: 使用 adodb.stream 元件來進行文件編碼
	oStream = new ActiveXObject("adodb.stream");   
	oStream.Type=1;
	oStream.Mode=3;
	oStream.Open();
	oStream.Write(content);
	oStream.Position=0;   
	oStream.Type=2;
	oStream.Charset="Big5"   
	result= oStream.ReadText();   
	// Step 3: 使用 Hokoy.WordKit 來轉換成簡體
	wordToolObj = new ActiveXObject("Hokoy.WordKit");
	gbContent=wordToolObj.Big5toGB(result);
	// Step 4: 改變網頁編碼並將資料呈現於網頁
	Response.Charset="gb2312";
	Response.Write(gbContent);
	Response.End();
}
%>

在上述程式碼中,其工作流程可以說明如下:

  1. 若發覺有 language=gb 的選項,則刪除此選項,然後抓取網頁內容。
  2. 將網頁內容轉成簡體,此流程和前一個範例是完全一樣的。

JScript 程式設計與應用:用於伺服器端的 ASP 環境